package modele;

import java.awt.Color;
import java.io.Serializable;

public class Point extends FormeGeometrique implements Serializable {

	protected int x;
	protected int y;
	
	// constructeur 1
	public Point() {
		x = 0;
		y = 0;
	}
	// constructeur 2
	public Point(int a, int b) {
		x = a;
		y = b;
	}
	public Point(int a, int b, Color c) {
		this.x = a;
		this.y = b;
		this.couleur = c;
		
	}

	// constructeurs secondaires

	public Point(int x, int y, Color couleur, String nom) {
		this.x = x;
		this.y = y;
		this.couleur = couleur;
		this.nom = nom;
	}

	public Point createClone() {
		Point Clone = new Point(this.getX(), this.getY(), this.getCouleur(), this.getNom());
		return Clone;
	}

	public Point createSymetrieO() {
		Point Resultat = new Point(-this.getX(), -this.getY());
		return Resultat;
	}

	public Point createSymetrieX() {
		Point Resultat = new Point(this.getX(), -this.getY());
		return Resultat;
	}

	public Point createSymetrieY() {
		Point Resultat = new Point(-this.getX(), this.getY());
		return Resultat;
	}

	// Observateurs canoniques

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	// Observateurs autres

	public double distance(Point loin) {
		int xa = this.x;
		int ya = this.y;
		int xb = loin.x;
		int yb = loin.y;

		double distance = Math.sqrt(Math.pow(xb - xa, 2) 
				+ Math.pow(yb - ya, 2));
		return distance;
	}

	public String toString() {
		String rapport = new String("Coordonnées du point (X,Y) : ("
				+ this.getX() + "," + this.getY() + ")");
		return rapport;
	}

	public double perimetre() {
		return 0;
	}

	public double surface() {
		return 0;
	}

	// observateurs relationels

	/*
	 * On veut redefinir le equals. pour ça il faut avoir la meme signature donc
	 * l'argument doit etre une forme geometrique.
	 * 
	 * on redefinit en utilisant la meme signature. Probleme : notre equals peut
	 * prendre n'importe quoi. Solution : on test qu'on a bien un Point
	 * 
	 * Du coup vu qu'on prend un FormeGeometrique et qu'on veut comparer x et y
	 * .... pour la forme geometrique ça n'existe pasdonc on doit CASTER notre
	 * sujet(argument)
	 */
	public boolean equals(FormeGeometrique sujet) {
		if (sujet instanceof Point) {
			return (this.x == ((Point) sujet).x && this.y == ((Point) sujet).y);
		} else {
			return false;
		}
	}

	public int compare(Point sujet) {

		Point Origine = new Point(0, 0);

		double dthiszero = this.distance(Origine);
		double dsujetzero = sujet.distance(Origine);

		if (dthiszero == dsujetzero)
			return 0;
		if (dthiszero > dsujetzero)
			return 1;
		if (dthiszero < dsujetzero)
			return -1;
		return 2;

	}

	// Mutateurs canoniques

	public void setX(int n) {
		this.x = n;
	}

	public void setY(int n) {
		this.y = n;
	}

	// Autres mutateurs

	public void symetrieO() {
		this.x = -this.x;
		this.y = -this.y;
	}

	public void symetrieX() {
		this.y = -this.y;
	}

	public void symetrieY() {
		this.x = -this.x;
	}

	public void projectionX() {
		this.y = 0;
	}

	public void projectionY() {
		this.x = 0;
	}

	// finalize

	public void finalize() {
		System.out.println("************GC WAS HERE********");
	}
	
	
}
